package pt.isel.lercm.projectmanager.spring.model;

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name="GRUPO_REDMINE")
public class GrupoRedmine {
	
	private int id;
	private String nome;
	private Grupo grupo;
	private Set<Aluno> alunos;
	private Integer idProject;
	private AnoLectivo anoLectivo;
	
	@Id
	@SequenceGenerator(name="ID_GENERATOR", sequenceName="hibernate_sequence", allocationSize=1)  
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ID_GENERATOR")
	@Column(name="ID", unique = true, nullable = false)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	@Column(name="NOME", nullable = true)
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	@OneToOne
    @JoinColumn(name = "grupo_id")
	public Grupo getGrupo() {
		return grupo;
	}
	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}
	
	@OneToMany(fetch = FetchType.EAGER, mappedBy = "grupoRedmine")
	public Set<Aluno> getAlunos() {
		return alunos;
	}
	public void setAlunos(Set<Aluno> alunos) {
		this.alunos = alunos;
	}
	
	@Column(name="ID_TEAM_REDMINE", nullable = true)
	public Integer getIdProject() {
		return idProject;
	}
	public void setIdProject(Integer idProject) {
		this.idProject = idProject;
	}
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "ANO_ID")
	public AnoLectivo getAnoLectivo() {
		return anoLectivo;
	}
	public void setAnoLectivo(AnoLectivo anoLectivo) {
		this.anoLectivo = anoLectivo;
	}
	
	@Transient
	public Integer getNumAlunos(){
		if (alunos != null && !alunos.isEmpty()){
			return alunos.size();
		}
		
		return  0;
	}
	
	@Transient
	public boolean isNew(){
		return id == 0;
	}
	
	@Transient
	public boolean equals(Object obj){
		if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (!(obj instanceof GrupoRedmine))
            return false;

        GrupoRedmine rhs = (GrupoRedmine) obj;
        
        return rhs.getId() == this.id;
	}
}
